/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package andisoft.uniandes.ecos.runt.services;

import andisoft.uniandes.ecos.runt.persistence.RNC;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

/**
 *
 * @author Felipe
 */
@Stateless
public class RNCFacadeBean implements RNCFacadeRemote {

    
    protected EntityManager em;
    //RNCMock em;
    
    public RNCFacadeBean(){
        if (em == null){
            try{
                em = Persistence.createEntityManagerFactory("RUNTBLLPU").createEntityManager();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    
    @SuppressWarnings("unchecked")
    public void addConductor(RegistroConductoresBO rncBO) throws PersistenciaException{
        
        try{
            RNC conductor = new RNC(rncBO);
            EntityTransaction transaction = em.getTransaction();
            transaction.begin();
            em.persist(conductor);
            transaction.commit();
        }catch (Exception e) {
            e.printStackTrace();
            throw new PersistenciaException("Error al adicionar el conductor ("+e.getMessage()+")");
        }finally{
            if(em!=null)
                em.close();
        }
        
    }

    @SuppressWarnings("unchecked")
    public void removeConductor(String tipoIdetificacion, String numeroIdentificacion)  throws PersistenciaException{
        RegistroConductoresBO conductor;
        try {

            List<RegistroConductoresBO> conductores = getConductoresByIdentificacion(tipoIdetificacion, numeroIdentificacion);
            if(conductores.size() > 0){
                conductor = conductores.get(0);
                
                EntityTransaction transaction = em.getTransaction();
                transaction.begin();
                em.remove(new RNC(conductor));
                transaction.commit();
                
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new PersistenciaException("Problema al listar las Instancia de Proceso.");
        }
    }
    
    @SuppressWarnings("unchecked")
    public void removeConductor(RegistroConductoresBO condu)  throws PersistenciaException{
        try {

            EntityTransaction transaction = em.getTransaction();
            transaction.begin();
            
            RNC rnc = new RNC(condu);
            
            RNC r2 = em.merge(rnc);
            em.remove(r2);
            transaction.commit();
                
        } catch (Exception e) {
            e.printStackTrace();
            throw new PersistenciaException("Problema al eliminar el conductor.");
        }
    }

    @SuppressWarnings("unchecked")
    public List<RegistroConductoresBO> getConductores() throws PersistenciaException{
        try
        {
            Query cons = em.createNamedQuery("RNC.findAllConductores");
            List<RNC> lista = cons.getResultList();
            List<RegistroConductoresBO> bos = new ArrayList<RegistroConductoresBO>();
            
            System.out.println(lista.getClass());
            Iterator i = lista.iterator();
            while (i.hasNext()){
                Object o = i.next();
                
                RNC rnc = (RNC)o;
                   
                RegistroConductoresBO actual = rnc.toBO();
                bos.add(actual);
                
            }
            
            return bos;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            throw new PersistenciaException("Problema al consultar los conductores ("+e.getMessage()+").");
        }
    }

    @SuppressWarnings("unchecked")
    public List<RegistroConductoresBO> getConductoresByNombreAndApellido(String nombres, String apellidos) {
            Query cons = em.createNamedQuery("findAllConductoresByName");
            List<RNC> lista = cons.getResultList();
            List<RegistroConductoresBO> bos = new ArrayList<RegistroConductoresBO>();
            for (RNC p : lista)
            {
            	RegistroConductoresBO actual = p.toBO();
            	bos.add(actual);
            }
            return bos;
    }

    @SuppressWarnings("unchecked")
    public List<RegistroConductoresBO> getConductoresByIdentificacion(String tipoIdetificacion, String numeroIdentificacion) {
            Query cons = em.createNamedQuery("findAllConductoresByIdentification");
            List<RNC> lista = cons.getResultList();
            List<RegistroConductoresBO> bos = new ArrayList<RegistroConductoresBO>();
            for (RNC p : lista)
            {
            	RegistroConductoresBO actual = p.toBO();
            	bos.add(actual);
            }
            return bos;            
    }
}
